#include <iostream>
#include<vector>
using namespace std;

int main()
{
    int n;
    vector<vector<int>> a;  //存储所有组合
    vector<int> b;    //存储某一个组合
    cin>>n;
    int stateCount = 1 << n;  
    for (int i = 0; i < stateCount; ++i)  //对i 循环，目的让 1-n 位从000 .. 000 到 111...111，取值范围
    {
        for (int j = 0; j < n; ++j)    //目的 用于移位，知道移位的大小，从而知道移位后的数哪一位为 1
            if ((1 << j) & i)  //判断 i的 j+1位是否为1
                b.push_back(j + 1);
        if(! b.empty())
        {
            a.push_back(b);
        }
        b.clear();
    }
    
    // for(vector<int>::iterator it=b.begin();it!=b.end();it++){
    //     cout<<(*it).<<" ";
    // }
    // for (auto lin : line) {
    //     cout << lin;
    // }
    cout << "<----- 遍历输出所有元素 ----->" << endl;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            cout << a[i][j] << "  ";
        }
        cout << endl;
    }
    return 0;
}

两条不同长度的无环单向链表，寻找它们的第一个交点。

如果上面的两个单向链表相交，则从交点起，两者就合并到同一条链，好像 Y 型一样。

方法：
1. 确定两链表的长度差 n，让较长的链表先向后走 n 步。 此时两链表依次向后走一步，查看结点是否相同，第一个相同的就是第一个交点。(链表长度可以通多遍历一边链表获得。)
2. 两条链表同时依次向后访问，每次一步，选其中一条链表的的结点作为哈希表的键，值设为1表示出现过，同时使用另一链表的结点作为键查看是否在哈希表中出现过，如果出现过则此结点就为第一个交点。
